var token = "UFgGlyPTiFytLhUVCbb6vAiGp4MDNU8I6e8uSxoGP+Y=";
var appid = "2018042554548";

// 上传地址
var url = "http://lc.api.filestoresystem.my.com/upload";

// 待上传的文件队列
var file_quenec = new Array();

/**
 * 文件队列生成器
 */
function fileQuenec(files){
	// 文件错误
	if(!files){
		return ;
	}
	
	// 文件切割大小：2M
	var chunkSize = 1 * 1024 * 1024;
	
	// 遍历文件
	$(files).each(function(index, file_item){
		// 显示文件列表
		$("#file_list").append('<li>文件名：'+file_item.name+'</li>');
		
		// 文件大小大于分块阈值：切块 
		if(file_item.size > chunkSize){
			//分割块数
			var chunks = Math.max(Math.floor(file_item.size / chunkSize), 1)+1;	
			for(var i=0; i<chunks; i++){
				var startIndex = i*chunkSize;		// 块的开始位置
				var endIndex = startIndex+chunkSize;		// 块的结束位置
				
				// 块最大结束位置 = 文件最大大小
				if(endIndex > file_item.size){
					endIndex = file_item.size;
				}
				
				// 最后一个文件块
				var lastChunk = false;
				if(i == (chunks-1)){
					lastChunk = true;
				}
				
				// 任务队列
				var task = {
					file: file_item		// 文件对象
					,uuid: file_item.name			// 分块唯一ID
					,chunked: true			// 是否分块
					,startIndex: startIndex		// 分块起始位置
					,endIndex: endIndex			// 分块结束位置
					,currentChunk: i			// 当前分块
					,totalChunk: chunks			// 总分块数
				};
				
				// 任务入列
				file_quenec.push(task);
			}
			
		}else{
			// 文件大小小于分块阈值：不切块 
			var task = {
				file: file_item		// 文件对象
				,uuid: file_item.name		// 文件唯一ID
				,chunked: false  	// 是否分块
			};
			file_quenec.push(task);
		}
	});
}

/**
 * 上传处理器
 * @param string name		上传器名称
 */
function Uploader(name){
	this.url = url;		// 上传地址
	this.req = new XMLHttpRequest();		// 创建 xhr
	this.tasks;		// 任务队列
	this.taskIndex = 0;		//当前处理的任务下标
	this.name = name;		// 名称
	this.status = 0;	// 状态；0：初始、1：所有任务成功、2：异常
	
	/**
	 * 上传动作
	 */
	this.upload = function(uploader){
		this.req.responseType = 'json';		// 响应数据格式
		
		// 注册load 事件
		this.req.addEventListener("load", function(){
			// 更新对应进度条
			//progressUpdate(this.response.uuid, this.response.fileSize);
			// 从任务队列中取一个再次发送
			var task = uploader.tasks[uploader.taskIndex];
			if(task){
				console.log(uploader.name+":当前执行的任务编号："+uploader.taskIndex);
				
				this.open("POST", uploader.url);		// POST 方式请求上传地址
				this.send(uploader.buildFormData(task));	// 发送文件二进制流数据
				uploader.taskIndex++;
			}else{
				console.log("处理完成！");
				uploader.status = 1;
			}
		});
		
		// 处理第一个
		var task = this.tasks[this.taskIndex];
		if(task){
			console.log(uploader.name+":当前执行的任务编号："+this.taskIndex);
			
			this.req.open('POST', this.url);		// POST 方式请求上传地址
			this.req.send(this.buildFormData(task));	// 发送文件二进制流数据
			this.taskIndex++;
		}else{
			uploader.status = 1;
		}
	}
	
	/**
	 * 提交
	 */
	this.submit = function(tasks){
		this.tasks = tasks;
	}
	
	/**
	 * 构建表单数据
	 * @param sting task			名称
	 */
	this.buildFormData = function(task){
		// 文件对象
		var file = task.file;
		// 穿件表单示例
		var fromData = new FormData();
		fromData.append("token", token);		// token
		fromData.append("appid", appid);		// appid
		fromData.append("fileName", file.name);		// 文件名称
		fromData.append("fileSize", file.size);		// 文件大小
		fromData.append("uuid", appid+task.uuid);		// 文件或文件分块ID
		
		// 不分块
		if(!task.chunked){
			fromData.append("data", file);		// 文件数据：整个文件
			return fromData;
		}
		
		// 分块
		fromData.append("chunked", task.chunked);		// 分块标识
		fromData.append("currentChunk", task.currentChunk);		// 当前分块
		fromData.append("totalChunk", task.totalChunk);		// 总共分块
		fromData.append("data", file.slice(task.startIndex, task.endIndex));		// 文件数据：分块数据(文件截取)
		
		return fromData;
	}
}

function doUpload(){
	// 创建线程
	for(var i=0; i<file_quenec.length; i++){
		var Up = new Uploader('upload');
		var task = new Array();
		task.push(file_quenec[i]);
		
		// 提交任务，启动线程上传
		Up.submit(task);
		Up.upload(Up);
	}
}

/**
 * 上传操作
 */
function _doUpload(){
	// 启动4个上传器（4个线程）
	var upload_0 = new Uploader('upload_0');
	var task_0 	= new Array();
	
//			if(file_quenec.length == 0){
//				task_0.push(file_quenec[i]);
//			}
	
	var upload_1 = new Uploader('upload_0');
	var task_1 = new Array();
	
	var upload_2 = new Uploader('upload_0');
	var task_2 = new Array();
	
	var upload_3 = new Uploader('upload_0');
	var task_3 = new Array();
	
	// 将文件列表取模hash，分配给4个上传器
	for(var i=0; i<file_quenec.length; i++){
		if(i%4 == 0){
			task_0.push(file_quenec[i]);
		}else if(i%4 == 1){
			task_1.push(file_quenec[i]);
		}else if(i%4 == 2){
			task_2.push(file_quenec[i]);
		}else if(i%4 == 3){
			task_3.push(file_quenec[i]);
		}
	}
	console.log(task_0);
	console.log(task_1);
	console.log(task_2);
	console.log(task_3);
	
	// 提交任务，启动线程上传
	upload_0.submit(task_0);
	upload_0.upload(upload_0);
	
	upload_1.submit(task_1);
	upload_1.upload(upload_1);
	
	upload_2.submit(task_2);
	upload_2.upload(upload_2);
	
	upload_3.submit(task_3);
	upload_3.upload(upload_3);
	
	//注册一个定时任务，每2秒监控文件是否都上传完毕
//			uploadCompleteMonitor = setInterval("uploadComplete()",2000);
}

/**
 * UUID 生成器
 */
function uuid() {
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = "-";
 
    var uuid = s.join("");
    return uuid;
}